<?php

namespace Api\Openapi;


use S\Http;

/**
 * Class Auth
 * @package Api\Openapi
 * @description 认证工具类
 */
class Auth {

    const URI_AUTH_CERT = "/auth/cert";  //使用证件进行真实身份认证
    const URI_AUTH_BANK_CARD = "/auth/bankcard";  //认证银行卡
    const URI_QUERY_BANK_CARD_INFO = "/bank/retrival";  //获取银行卡详细信息
    const URI_AUTH_EDU_DEGREE = "/auth/edu/degree";  //认证学历
    const URI_AUTH_PORTRAIT = "/portrait/verify";  //认证人像照片
    const URI_AUTH_EDU_ENROLL = "/auth/edu/enroll"; //认证学籍

    const CERT_TYPE_ID_CARD = "01";  //证件类型－身份证

    private $_err_msg = "";
    private $_cert_info = array();

    /**
     * 使用证件进行真实身份认证
     *
     * @param string $cert_type 证件类型
     * @param string $cert_no 证件号码
     * @param string $name 用户姓名
     * @param int $timeout default 60000
     *
     * @return bool true－认证成功 此时可调用getCertInfo获取证件资讯 false－认证失败，此时调用获取getErrMsg错误资讯
     */
    public function verifyCert($cert_type, $cert_no, $name, $timeout = Util::DEFAULT_TIMEOUT){
        $params = array(
            "header" => array(),
            "body" => array(
                "cert_type" => $cert_type,
                "cert_no" => $cert_no,
                "name" => $name,
            ),
        );

        $resp_data = Util::request(self::URI_AUTH_CERT, $params, $timeout)["body"];
        $auth_result = $resp_data["auth_result"];
        if ($auth_result) {
            $this->_cert_info = $resp_data["info"];
        } else {
            $this->_err_msg = $resp_data["auth_msg"];
        }

        return $auth_result;
    }

    /**
     * 获取证件资讯
     *
     * @return array
     */
    public function getCertInfo(){
        return $this->_cert_info;
    }

    /**
     * 使用证件进行真实身份认证
     *
     * @param string $acct_no 银行账号
     * @param string $name 银行户名
     * @param string $bank_id 银行编码
     * @param string $cert_type default null 证件类型
     * @param string $cert_no default null 证件号码
     * @param string $mobile default null 开户预留手机号码
     * @param int $timeout default 3000 超时时间，默认3s
     *
     * @return bool true－认证成功 false－认证失败，此时调用获取getErrMsg错误资讯
     */
    public function verifyBankcard($acct_no, $name, $bank_id, $cert_type = null, $cert_no = null, $mobile = null, $timeout = 3000){
        $params = array(
            "header" => array(),
            "body" => array(
                "acct_no" => $acct_no,
                "name" => $name,
                "cert_type" => $cert_type,
                "cert_no" => $cert_no,
                "mobile" => $mobile,
                "bank_id" => $bank_id,
            ),
        );

        $resp_data = Util::request(self::URI_AUTH_BANK_CARD, $params, $timeout)["body"];
        $auth_result = $resp_data["auth_result"];
        if (!$auth_result) {
            $this->_err_msg = $resp_data["auth_msg"];
        }

        return $auth_result;
    }

    /**
     * 根据卡号获取银行卡资讯
     *
     * @param $acct_no
     *
     * @return array bank_id 银行代码 bank_name 银行名称 bank_abbr 银行简称
     */
    public function queryBankInfo($acct_no) {
        $params = array(
            "header" => array(),
            "body" => array(
                "card_no" => $acct_no,
            ),
        );

        $info = Util::request(self::URI_QUERY_BANK_CARD_INFO, $params)["bank_info"];

        return empty($info) ? array() : $info;
    }

    /**
     * 学历认证
     *
     * @param string $cert_no 证件号码
     * @param string $name 用户姓名
     * @param int $timeout default 15000
     *
     * @return bool true－认证成功 此时可调用getCertInfo获取证件资讯 false－认证失败，此时调用获取getErrMsg错误资讯
     */
    public function queryDegreeInfo($cert_no, $name, $timeout = 15000){
        $params = array(
            "header" => array(),
            "body" => array(
                "cert_no" => $cert_no,
                "name" => $name,
            ),
        );

        $degree_info = Util::request(self::URI_AUTH_EDU_DEGREE, $params, $timeout)["body"];

        return $degree_info;
    }

    /**
     * 学籍比对
     *
     * @param string $cert_no      证件号
     * @param string $name         姓名
     * @param string $enroll_date  入学年份 四位 e.g. 2015
     * @param string $school       学校全称
     * @param int $degree       学历层次 有1-本科、2-专科、3-硕士、4-博士 4种类型
     * @param int $degree_type     学历类别 1-普通、2-研究生、5-成人、6-自考、7-网络教育、8-开放教育;
     * @param int $timeout
     * @return array               array(
     *                                 'cert_no'     比对的证件号
     *                                 'name'        比对的姓名
     *                                 'degree'      true-比对正确  false-比对失败
     *                                 'degree_type' true-比对正确  false-比对失败
     *                                 'school'      true-比对正确  false-比对失败
     *                                 'enroll_date' true-比对正确  false-比对失败
     *                             )
     *                            证件号和姓名不匹配时四项都会是false
     */
    public function queryEnrollInfo($cert_no, $name, $enroll_date = null, $school = null, $degree = null, $degree_type = null, $timeout = 2000){
        $params = array(
            "header" => array(),
            "body" => array(
                "cert_no" => $cert_no,
                "name" => $name,
                "enroll_date" => $enroll_date,
                "school" => $school,
                "degree" => $degree,
                "degree_type" => $degree_type
            ),
        );

        $enroll_info = Util::request(self::URI_AUTH_EDU_ENROLL, $params, $timeout)["body"];

        return $enroll_info;
    }

    /**
     * 人脸身份确认
     *
     * @param string $cert_no 用户身份证号
     * @param string $name 用户姓名
     * @param string $front_img_oss_url 用户提供的正脸照片url
     * @param string $cert_front_img_oss_url 用户提供的身份证正面照片url
     * @param string $cert_back_img_oss_url 用户提供的身份证背面照片url
     * @param string $canonical_face_img_oss_url 来自权威机构的（例如公安部、学信等）与该身份证号关联的头像照片（一或多张），使用','分割
     * @param int $timeout default 2000 超时时间
     *
     * @return int 0 拒绝；1 通过；2 需人工复审。
     */
    public function verifyPortrait($cert_no, $name, $front_img_oss_url, $cert_front_img_oss_url, $cert_back_img_oss_url, $canonical_face_img_oss_url, $timeout = Http::TIMEOUT){
        $params = array(
            "header" => array(),
            "body" => array(
                "cert_no" => $cert_no,
                "name" => $name,
                "face_img_url" => $front_img_oss_url,
                "card_front_img_url" => $cert_front_img_oss_url,
                "card_back_img_url" => $cert_back_img_oss_url,
                "canonical_face_img_url" => $canonical_face_img_oss_url,
            ),
        );

        $resp_data = Util::request(self::URI_AUTH_PORTRAIT, $params, $timeout);

        return $resp_data["result"];
    }

    /**
     * 获取错误资讯
     *
     * @return string
     */
    public function getErrMsg(){
        $msg = $this->_err_msg;
        $this->_err_msg = "";

        return $msg;
    }

} 